package com.atguigu.gmall.all.controller;

import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.list.client.ListFeignClient;
import com.atguigu.gmall.model.list.SearchParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
public class ListController {

    @Autowired
    private ListFeignClient listFeignClient;
    //  http://list.gmall.com/list.html?category3Id=61
    //  http://list.gmall.com/list.html?keyword=小米手机
    //  springmvc 对象传值的时候： 实体类的属性名 与 ? 后面的参数名称一致.
    @GetMapping("list.html")
    public String list(SearchParam searchParam, Model model){
        //  需要做远程调用.
        Result<Map> result = listFeignClient.list(searchParam);
        //  后台应该存储：searchParam，trademarkParam，urlParam， propsParamList， trademarkList，attrsList，orderMap，goodsList，pageNo，totalPages
        //  编写一个方法.
        String urlParam = this.makeUrlParm(searchParam);
        //  品牌面包屑传递的数据: trademark=1:小米
        String trademarkParam = this.makeTradeMarkParam(searchParam.getTrademark());
        //  平台属性面包屑： 平台属性数据. 23:4G:运行内存 一个或多个。
        //  可以返回一个实体类. attrId attrValue attrName 必须有三个属性.
        //  可以返回一个map： key 分别是 attrId attrValue attrName
        List<Map> propsParamList = this.makePropsParamList(searchParam.getProps());
        //  要么使用map 要么使用实体类  type  sort
        //  传递数据：order=2:desc
        Map<String,Object> orderMap = this.makeOrderMap(searchParam.getOrder());

        //  存储数据：
        model.addAttribute("searchParam",searchParam);
        //  urlParam --- 拼接用户查询的条件的。
        model.addAttribute("urlParam",urlParam);
        //  trademarkParam --- 品牌面包屑
        model.addAttribute("trademarkParam",trademarkParam);
        //  propsParamList --- 平台属性面包屑
        model.addAttribute("propsParamList",propsParamList);
        //  orderMap --- 排序

        model.addAttribute("orderMap",orderMap);

        //  result.getData(); 获取到的对象 SearchResponseVo trademarkList,attrsList,goodsList,pageNo,totalPages
        //  class 与  map 可以互相替换.
        model.addAllAttributes(result.getData());

        //  返回检索页面视图名称.
        return "list/index";
    }

    //  制作map order=2:desc
    //  排序： type 表示的是 综合，还是价格  sort 表示的是排序规则.
    private Map<String, Object> makeOrderMap(String order) {
        Map<String, Object> map = new HashMap<>();
        //  有两个key  type ,sort;
        //  判断
        if (!StringUtils.isEmpty(order)){
            String[] split = order.split(":");
            if (split!=null && split.length==2){
                map.put("type",split[0]);
                map.put("sort",split[1]);
            }
        }else {
            map.put("type","1");
            map.put("sort","desc");
        }
        return map;
    }

    //  &props=24:128G:机身内存&props=23:8G:运行内存
    private List<Map> makePropsParamList(String[] props) {
        //  声明集合.
        List<Map> mapList = new ArrayList<>();
        //  判断
        if (props!=null && props.length>0){
            //  循环遍历
            for (String prop : props) {
                String[] split = prop.split(":");
                if (split!=null && split.length==3){
                    HashMap<String, Object> hashMap = new HashMap<>();
                    hashMap.put("attrId",split[0]);
                    hashMap.put("attrValue",split[1]);
                    hashMap.put("attrName",split[2]);
                    //  将map 添加到集合中.
                    mapList.add(hashMap);
                }
            }
        }

        //  返回数据
        return mapList;
    }

    //  面包屑：品牌  1:小米
    private String makeTradeMarkParam(String trademark) {
        //  判断
        if (!StringUtils.isEmpty(trademark)){
            String[] split = trademark.split(":");
            //  获取品牌名称
            if (split!=null && split.length==2){
                return "品牌:"+split[1];
            }
        }
        return null;
    }

    private String makeUrlParm(SearchParam searchParam) {
        //  记录拼接的url.
        StringBuilder stringBuilder = new StringBuilder();

        //  https://list.jd.com/list.html?cat=9987,2C653,2C655&ev=13743_42587%5E&cid3=655
        //  http://sph-list.atguigu.cn/list.html?category3Id=61&props=24:256G:%E6%9C%BA%E8%BA%AB%E5%86%85%E5%AD%98&order=
        //  判断用户是否根据分类Id 检索.
        //  http://sph-list.atguigu.cn/list.html?category1Id=2
        if (!StringUtils.isEmpty(searchParam.getCategory1Id())){
            stringBuilder.append("category1Id=").append(searchParam.getCategory1Id());
        }
        if (!StringUtils.isEmpty(searchParam.getCategory2Id())){
            stringBuilder.append("category2Id=").append(searchParam.getCategory2Id());
        }
        if (!StringUtils.isEmpty(searchParam.getCategory3Id())){
            stringBuilder.append("category3Id=").append(searchParam.getCategory3Id());
        }

        //  还可以通过关键词检索.
        //  http://sph-list.atguigu.cn/list.html?keyword=手机
        if (!StringUtils.isEmpty(searchParam.getKeyword())){
            stringBuilder.append("keyword=").append(searchParam.getKeyword());
        }

        //  http://sph-list.atguigu.cn/list.html?keyword=手机&trademark=1:小米
        if (!StringUtils.isEmpty(searchParam.getTrademark())){
            if (stringBuilder.length()>0){
                stringBuilder.append("&trademark=").append(searchParam.getTrademark());
            }
        }

        //  平台属性. http://sph-list.atguigu.cn/list.html?keyword=手机&trademark=1:小米&props=24:256G:机身内存&props=23:4G:运行内存
        String[] props = searchParam.getProps();
        //  判断
        if (props!=null && props.length>0){
            //  循环遍历。
            for (String prop : props) {
                if (stringBuilder.length()>0){
                    stringBuilder.append("&props=").append(prop);
                }
            }
        }
        //  返回url 路径
        return "list.html?"+stringBuilder.toString();
    }


}


